'\" t
.TH "SD_BUS_CALL_METHOD" "3" "" "systemd 257.1" "sd_bus_call_method"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
sd_bus_call_method, sd_bus_call_methodv, sd_bus_call_method_async, sd_bus_call_method_asyncv \- Initialize a bus message object and invoke the corresponding D\-Bus method call
.SH "SYNOPSIS"
.sp
.ft B
.nf
#include <systemd/sd\-bus\&.h>
.fi
.ft
.HP \w'typedef\ int\ (*sd_bus_message_handler_t)('u
.BI "typedef int (*sd_bus_message_handler_t)(sd_bus_message\ *" "m" ", void\ *" "userdata" ", sd_bus_error\ *" "ret_error" ");"
.HP \w'int\ sd_bus_call_method('u
.BI "int sd_bus_call_method(sd_bus\ *" "bus" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_error\ *" "ret_error" ", sd_bus_message\ **" "reply" ", const\ char\ *" "types" ", \&.\&.\&.);"
.HP \w'int\ sd_bus_call_methodv('u
.BI "int sd_bus_call_methodv(sd_bus\ *" "bus" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_error\ *" "ret_error" ", sd_bus_message\ **" "reply" ", const\ char\ *" "types" ", va_list\ " "ap" ");"
.HP \w'int\ sd_bus_call_method_async('u
.BI "int sd_bus_call_method_async(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ", const\ char\ *" "types" ", \&.\&.\&.);"
.HP \w'int\ sd_bus_call_method_asyncv('u
.BI "int sd_bus_call_method_asyncv(sd_bus\ *" "bus" ", sd_bus_slot\ **" "slot" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ", sd_bus_message_handler_t\ " "callback" ", void\ *" "userdata" ", const\ char\ *" "types" ", va_list\ " "ap" ");"
.SH "DESCRIPTION"
.PP
\fBsd_bus_call_method()\fR
is a convenience function for initializing a bus message object and calling the corresponding D\-Bus method\&. It combines the
\fBsd_bus_message_new_method_call\fR(3),
\fBsd_bus_message_append\fR(3)
and
\fBsd_bus_call\fR(3)
functions into a single function call\&.
.PP
\fBsd_bus_call_method_async()\fR
is a convenience function for initializing a bus message object and calling the corresponding D\-Bus method asynchronously\&. It combines the
\fBsd_bus_message_new_method_call\fR(3),
\fBsd_bus_message_append\fR(3)
and
\fBsd_bus_call_async\fR(3)
functions into a single function call\&.
.SH "RETURN VALUE"
.PP
On success, these functions return a non\-negative integer\&. On failure, they return a negative errno\-style error code\&.
.SS "Errors"
.PP
See the man pages of
\fBsd_bus_message_new_method_call\fR(3),
\fBsd_bus_message_append\fR(3),
\fBsd_bus_call\fR(3)
and
\fBsd_bus_call_async\fR(3)
for a list of possible errors\&.
.SH "NOTES"
.PP
Functions described here are available as a shared library, which can be compiled against and linked to with the
\fBlibsystemd\fR\ \&\fBpkg-config\fR(1)
file\&.
.PP
The code described here uses
\fBgetenv\fR(3), which is declared to be not multi\-thread\-safe\&. This means that the code calling the functions described here must not call
\fBsetenv\fR(3)
from a parallel thread\&. It is recommended to only do calls to
\fBsetenv()\fR
from an early phase of the program when no other threads have been started\&.
.SH "EXAMPLES"
.PP
\fBExample\ \&1.\ \&Make a call to a D\-Bus method that takes a single parameter\fR
.sp
.if n \{\
.RS 4
.\}
.nf
/* SPDX\-License\-Identifier: MIT\-0 */

/* This is equivalent to:
 * busctl call org\&.freedesktop\&.systemd1 /org/freedesktop/systemd1 \e
 *       org\&.freedesktop\&.systemd1\&.Manager GetUnitByPID $$
 *
 * Compile with \*(Aqcc print\-unit\-path\-call\-method\&.c \-lsystemd\*(Aq
 */

#include <errno\&.h>
#include <stdio\&.h>
#include <sys/types\&.h>
#include <unistd\&.h>

#include <systemd/sd\-bus\&.h>

#define _cleanup_(f) __attribute__((cleanup(f)))
#define DESTINATION "org\&.freedesktop\&.systemd1"
#define PATH        "/org/freedesktop/systemd1"
#define INTERFACE   "org\&.freedesktop\&.systemd1\&.Manager"
#define MEMBER      "GetUnitByPID"

static int log_error(int error, const char *message) {
  fprintf(stderr, "%s: %s\en", message, strerror(\-error));
  return error;
}

int main(int argc, char **argv) {
  _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
  _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
  _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
  int r;

  r = sd_bus_open_system(&bus);
  if (r < 0)
    return log_error(r, "Failed to acquire bus");

  r = sd_bus_call_method(bus, DESTINATION, PATH, INTERFACE, MEMBER, &error, &reply, "u", (unsigned) getpid());
  if (r < 0)
    return log_error(r, MEMBER " call failed");

  const char *ans;
  r = sd_bus_message_read(reply, "o", &ans);
  if (r < 0)
    return log_error(r, "Failed to read reply");

  printf("Unit path is \e"%s\e"\&.\en", ans);

  return 0;
}
.fi
.if n \{\
.RE
.\}
.PP
This defines a minimally useful program that will open a connection to the bus, call a method, wait for the reply, and finally extract and print the answer\&. It does error handling and proper memory management\&.
.SH "HISTORY"
.PP
\fBsd_bus_call_method()\fR, and
\fBsd_bus_call_method_async()\fR
were added in version 221\&.
.PP
\fBsd_bus_call_methodv()\fR,
\fBsd_bus_call_method_asyncv()\fR
were added in version 246\&.
.SH "SEE ALSO"
.PP
\fBsystemd\fR(1), \fBsd-bus\fR(3), \fBsd_bus_message_new_method_call\fR(3), \fBsd_bus_message_append\fR(3), \fBsd_bus_call\fR(3), \fBsd_bus_set_property\fR(3), \fBsd_bus_emit_signal\fR(3)
